package com.sisgesbyte.web.managedBean.proyeccion;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;

import org.primefaces.model.DefaultTreeNode;
import org.primefaces.model.TreeNode;

import com.sisgesbyte.common.ConstantesInternasSistema;
import com.sisgesbyte.services.proyeccion.MantProyeccionGeneralService;
import com.sisgesbyte.services.proyeccion.bean.ListaProyGeneralCategoriaResponse;
import com.sisgesbyte.services.proyeccion.bean.ProyGeneralCategoriaBean;

@ManagedBean
@ViewScoped
public class ResumenProyeccionGeneralCategoriaMBean implements Serializable {

	private static final long serialVersionUID = 1L;
	@EJB
	private MantProyeccionGeneralService mantProyeccionGeneralService;
	private List<ProyGeneralCategoriaBean> listaProyGeneralCategoria;
	private String totalCategorias;
	private TreeNode selectedNode;
	private TreeNode root;
	private TreeNode[] node;
	private List<ProyGeneralCategoriaBean> listaCategoriaPadres;
	private List<ProyGeneralCategoriaBean> listaCategoriaHijos;
	private Map<Integer, Integer> auxNumNode;
	private int numNode;

	@PostConstruct
	private void init() {
		listaCategoriaPadres = new ArrayList<ProyGeneralCategoriaBean>();
		listaCategoriaHijos = new ArrayList<ProyGeneralCategoriaBean>();
		auxNumNode = new HashMap<Integer, Integer>();
		inicializar();
	}

	public void inicializar() {
		totalCategorias = "";
		try {
			numNode = 0;
			root = new DefaultTreeNode("Root", null);
			ListaProyGeneralCategoriaResponse response = mantProyeccionGeneralService
					.mostrarProyGeneralCategoria(ObtenerIdTransaccion());
			if (response.getCodigoRespuesta().equalsIgnoreCase(
					ConstantesInternasSistema.CODIGO_EXITO)) {
				listaCategoriaPadres = new ArrayList<ProyGeneralCategoriaBean>();
				listaCategoriaHijos = new ArrayList<ProyGeneralCategoriaBean>();
				for (ProyGeneralCategoriaBean ls : response
						.getListaProyGeneralCategoria()) {
					if (ls.getIdPadre() == 0) {
						listaCategoriaPadres.add(ls);
					} else {
						listaCategoriaHijos.add(ls);
					}
				}
				int max = response.getListaProyGeneralCategoria().size();
				if (max > 0) {
					node = new TreeNode[max];
					for (ProyGeneralCategoriaBean ls : listaCategoriaPadres) {
						node[numNode] = new DefaultTreeNode(ls, root);
						auxNumNode.put(ls.getId(), numNode);
						numNode++;
						assignChildren(ls);
					}
				}
			}
		} catch (Exception e) {
			System.out
					.println("Ocurrio un Error al tratar de obtener la lista "
							+ e.getMessage());
		}

	}

	/**
	 * Establece los nodos hijos a un árbol menu de forma recursiva.
	 * 
	 * @param father
	 *            El nodo padre.
	 */
	private void assignChildren(ProyGeneralCategoriaBean father) {
		List<ProyGeneralCategoriaBean> children = new ArrayList<ProyGeneralCategoriaBean>();
		children = getMenuByFather(father);
		Iterator<ProyGeneralCategoriaBean> iter = children.iterator();

		while (iter.hasNext()) {
			ProyGeneralCategoriaBean child = iter.next();
			node[numNode] = new DefaultTreeNode("document", child,
					node[auxNumNode.get(father.getId())]);
			auxNumNode.put(child.getId(), numNode);
			numNode++;
			assignChildren(child);
		}
	}

	/**
	 * Devuelve una lista de nodos según su padre.
	 * 
	 * @param father
	 *            El nodo padre.
	 * @return La lista de nodos.
	 */
	private List<ProyGeneralCategoriaBean> getMenuByFather(
			ProyGeneralCategoriaBean father) {

		List<ProyGeneralCategoriaBean> listR = new ArrayList<ProyGeneralCategoriaBean>();
		Iterator<ProyGeneralCategoriaBean> it = listaCategoriaHijos.iterator();
		while (it.hasNext()) {
			ProyGeneralCategoriaBean me = it.next();
			if (me.getIdPadre().intValue() == father.getId()) {
				listR.add(me);
				it.remove();
			}
		}
		return listR;
	}

	public String ObtenerIdTransaccion() {
		FacesContext fCtx = FacesContext.getCurrentInstance();
		HttpSession session = (HttpSession) fCtx.getExternalContext()
				.getSession(false);
		String sessionId = session.getId().replace(".undefined", "");
		return sessionId;
	}

	public MantProyeccionGeneralService getMantProyeccionGeneralService() {
		return mantProyeccionGeneralService;
	}

	public void setMantProyeccionGeneralService(
			MantProyeccionGeneralService mantProyeccionGeneralService) {
		this.mantProyeccionGeneralService = mantProyeccionGeneralService;
	}

	public String getTotalCategorias() {
		return totalCategorias;
	}

	public void setTotalCategorias(String totalCategorias) {
		this.totalCategorias = totalCategorias;
	}

	public List<ProyGeneralCategoriaBean> getListaProyGeneralCategoria() {
		return listaProyGeneralCategoria;
	}

	public void setListaProyGeneralCategoria(
			List<ProyGeneralCategoriaBean> listaProyGeneralCategoria) {
		this.listaProyGeneralCategoria = listaProyGeneralCategoria;
	}

	public TreeNode getSelectedNode() {
		return selectedNode;
	}

	public void setSelectedNode(TreeNode selectedNode) {
		this.selectedNode = selectedNode;
	}

	public TreeNode getRoot() {
		return root;
	}

	public void setRoot(TreeNode root) {
		this.root = root;
	}

}
